﻿namespace K.Client
{
    public abstract class KObj
    {
        public const long INVALID_OBJ_ID = 0;   //无效对象ID
        public const int OBJ_ID_BITS = 56;      //对象ID的范围最大为2^56个

        private long m_ObjId;   //所有对象的唯一标识
        public long ObjId
        {
            get { return m_ObjId; }
            set { m_ObjId = value; }
        }

        ~KObj()
        {
            // 在析构的时候，设置id_，可以保证内存中id_数据的合法性
            // 这是因为有时候需要通过id来访问数据，而在共享内存中的数据，并不会真正析构
            m_ObjId = INVALID_OBJ_ID;
        }

        public abstract void Init();

        public static long IdTwoType(long id)
        {
            // 先移位然后计算结果，可以避免得到负数
            return (id >> OBJ_ID_BITS) & 0X000000FF;
        }

        // 判断object是否合法
        // 由于开启异常处理不太方便，在这里加上这个函数。如果构造函数失败，只需要设置id =INVALID_OBJ_ID即可
        // 这种方式虽然比较丑类,但是可以比较有效的不使用异常来处理构造函数中发现的错误
        public bool IsValid()
        {
            return INVALID_OBJ_ID != m_ObjId;
        }

        // 设置对象非法
        public void InValid()
        {
            m_ObjId = INVALID_OBJ_ID;
        }
    }
}